# Encode string "Items on stack: " (0)
     push 0
     push 16
     set
     push 1
     push 73
     set
     push 2
     push 116
     set
     push 3
     push 101
     set
     push 4
     push 109
     set
     push 5
     push 115
     set
     push 6
     push 32
     set
     push 7
     push 111
     set
     push 8
     push 110
     set
     push 9
     push 32
     set
     push 10
     push 115
     set
     push 11
     push 116
     set
     push 12
     push 97
     set
     push 13
     push 99
     set
     push 14
     push 107
     set
     push 15
     push 58
     set
     push 16
     push 32
     set
# Encode string '' (17)

# HEAP[17] already equals 0.

# Encode string 'Number to add to stack: ' (18)
     push 18
     push 24
     set
     push 19
     push 78
     set
     push 20
     push 117
     set
     push 21
     push 109
     set
     push 22
     push 98
     set
     push 23
     push 101
     set
     push 24
     push 114
     set
     push 25
     push 32
     set
     push 26
     push 116
     set
     push 27
     push 111
     set
     push 28
     push 32
     set
     push 29
     push 97
     set
     push 30
     push 100
     set
     push 31
     push 100
     set
     push 32
     push 32
     set
     push 33
     push 116
     set
     push 34
     push 111
     set
     push 35
     push 32
     set
     push 36
     push 115
     set
     push 37
     push 116
     set
     push 38
     push 97
     set
     push 39
     push 99
     set
     push 40
     push 107
     set
     push 41
     push 58
     set
     push 42
     push 32
     set
# Encode string 'Do want to add a number? ' (43)
     push 43
     push 25
     set
     push 44
     push 68
     set
     push 45
     push 111
     set
     push 46
     push 32
     set
     push 47
     push 119
     set
     push 48
     push 97
     set
     push 49
     push 110
     set
     push 50
     push 116
     set
     push 51
     push 32
     set
     push 52
     push 116
     set
     push 53
     push 111
     set
     push 54
     push 32
     set
     push 55
     push 97
     set
     push 56
     push 100
     set
     push 57
     push 100
     set
     push 58
     push 32
     set
     push 59
     push 97
     set
     push 60
     push 32
     set
     push 61
     push 110
     set
     push 62
     push 117
     set
     push 63
     push 109
     set
     push 64
     push 98
     set
     push 65
     push 101
     set
     push 66
     push 114
     set
     push 67
     push 63
     set
     push 68
     push 32
     set
# Encode string 'yn' (69)
     push 69
     push 2
     set
     push 70
     push 121
     set
     push 71
     push 110
     set
# Encode string '\b' (72)
     push 72
     push 1
     set
     push 73
     push 8
     set
# Encode string ' ' (74)
     push 74
     push 1
     set
     push 75
     push 32
     set
# Encode string 'MENU\n====\n+ = Add\n- = Sub\n* = Mul\n
# / = Div\n% = Mod\nT = Top\nD = Dump\nQ = Quit\nChoice? ' (76)
     push 76
     push 84
     set
     push 77
     push 77
     set
     push 78
     push 69
     set
     push 79
     push 78
     set
     push 80
     push 85
     set
     push 81
     push 10
     set
     push 82
     push 61
     set
     push 83
     push 61
     set
     push 84
     push 61
     set
     push 85
     push 61
     set
     push 86
     push 10
     set
     push 87
     push 43
     set
     push 88
     push 32
     set
     push 89
     push 61
     set
     push 90
     push 32
     set
     push 91
     push 65
     set
     push 92
     push 100
     set
     push 93
     push 100
     set
     push 94
     push 10
     set
     push 95
     push 45
     set
     push 96
     push 32
     set
     push 97
     push 61
     set
     push 98
     push 32
     set
     push 99
     push 83
     set
     push 100
     push 117
     set
     push 101
     push 98
     set
     push 102
     push 10
     set
     push 103
     push 42
     set
     push 104
     push 32
     set
     push 105
     push 61
     set
     push 106
     push 32
     set
     push 107
     push 77
     set
     push 108
     push 117
     set
     push 109
     push 108
     set
     push 110
     push 10
     set
     push 111
     push 47
     set
     push 112
     push 32
     set
     push 113
     push 61
     set
     push 114
     push 32
     set
     push 115
     push 68
     set
     push 116
     push 105
     set
     push 117
     push 118
     set
     push 118
     push 10
     set
     push 119
     push 37
     set
     push 120
     push 32
     set
     push 121
     push 61
     set
     push 122
     push 32
     set
     push 123
     push 77
     set
     push 124
     push 111
     set
     push 125
     push 100
     set
     push 126
     push 10
     set
     push 127
     push 84
     set
     push 128
     push 32
     set
     push 129
     push 61
     set
     push 130
     push 32
     set
     push 131
     push 84
     set
     push 132
     push 111
     set
     push 133
     push 112
     set
     push 134
     push 10
     set
     push 135
     push 68
     set
     push 136
     push 32
     set
     push 137
     push 61
     set
     push 138
     push 32
     set
     push 139
     push 68
     set
     push 140
     push 117
     set
     push 141
     push 109
     set
     push 142
     push 112
     set
     push 143
     push 10
     set
     push 144
     push 81
     set
     push 145
     push 32
     set
     push 146
     push 61
     set
     push 147
     push 32
     set
     push 148
     push 81
     set
     push 149
     push 117
     set
     push 150
     push 105
     set
     push 151
     push 116
     set
     push 152
     push 10
     set
     push 153
     push 67
     set
     push 154
     push 104
     set
     push 155
     push 111
     set
     push 156
     push 105
     set
     push 157
     push 99
     set
     push 158
     push 101
     set
     push 159
     push 63
     set
     push 160
     push 32
     set
# Encode string '+-*/%tdq' (161)
     push 161
     push 8
     set
     push 162
     push 43
     set
     push 163
     push 45
     set
     push 164
     push 42
     set
     push 165
     push 47
     set
     push 166
     push 37
     set
     push 167
     push 116
     set
     push 168
     push 100
     set
     push 169
     push 113
     set
# Encode string 'Top: ' (170)
     push 170
     push 5
     set
     push 171
     push 84
     set
     push 172
     push 111
     set
     push 173
     push 112
     set
     push 174
     push 58
     set
     push 175
     push 32
     set
# Encode string 'Stack[' (176)
     push 176
     push 6
     set
     push 177
     push 83
     set
     push 178
     push 116
     set
     push 179
     push 97
     set
     push 180
     push 99
     set
     push 181
     push 107
     set
     push 182
     push 91
     set
# Encode string '] = ' (183)
     push 183
     push 4
     set
     push 184
     push 93
     set
     push 185
     push 32
     set
     push 186
     push 61
     set
     push 187
     push 32
     set
# Encode string 'Error: ' (188)
     push 188
     push 7
     set
     push 189
     push 69
     set
     push 190
     push 114
     set
     push 191
     push 114
     set
     push 192
     push 111
     set
     push 193
     push 114
     set
     push 194
     push 58
     set
     push 195
     push 32
     set
# Encode string 'DIV' (196)
     push 196
     push 3
     set
     push 197
     push 68
     set
     push 198
     push 73
     set
     push 199
     push 86
     set
# Encode string ' is illegal.' (200)
     push 200
     push 12
     set
     push 201
     push 32
     set
     push 202
     push 105
     set
     push 203
     push 115
     set
     push 204
     push 32
     set
     push 205
     push 105
     set
     push 206
     push 108
     set
     push 207
     push 108
     set
     push 208
     push 101
     set
     push 209
     push 103
     set
     push 210
     push 97
     set
     push 211
     push 108
     set
     push 212
     push 46
     set
# Encode string 'MOD' (213)
     push 213
     push 3
     set
     push 214
     push 77
     set
     push 215
     push 79
     set
     push 216
     push 68
     set
# This is the main program loop.
# Stack starts at HEAP[217]
part "MAIN"
     push 217
     call "STACK_SIZE"
     push 217
     call "GET_INPUT"
     goto "MAIN"
# def get_number(stack):
#     print('Number to add to stack: ')
#     number = int(input())
#     append(stack, number)
part "GET_NUMBER"
     push 18
     call "PRINT"
     push -1
     copy
     iint
     get
     call "APPEND"
     back
# def append(stack, number):
#     ptr = arg[0]
#     val = get(ptr)
#     val += 1
#     set(prt, val)
#     #
#     a = stack
#     b = stack
#     b = get(stack)
#     ptr = a + b
#     set(ptr, number)
#     del stack_ptr
part "APPEND"
# Increase stack size by one
     copy 1
     get
     push 1
     add
     copy 2
     swap
     set
# Store number in the open spot.
     copy 1
     copy 2
     get
     add
     swap
     set
     away
     back
# def in_array(array, key):
#     if len(array) <= 0:
#         return 0
#     offset = 1
#     while offset - len(array) >= 0:
#          ptr = array.ptr + offset
#          if array[ptr] == key:
#              return 1
#          offset += 1
#     return 0
part "IN_ARRAY"
# Line 1-2
     copy 1
     get
     less "__IA_RET_1"
     copy 1
     get
     zero "__IA_RET_1"
# Line 3
     push 1
# Line 4
part "__IA_LOOP"
     copy
     copy 3
     get
     swap
     sub
     less "__IA_RET_2"
# Line 5
     copy 2
     copy 1
     add
# Line 6
     get
     copy 2
     sub
     zero "__IA_RET_3"
# Line 8
     push 1
     add
     goto "__IA_LOOP"
# Line 9
part "__IA_RET_3"
     away
     push 1
     away 2
     back
part "__IA_RET_2"
     away
part "__IA_RET_1"
     push 0
     away 2
     back
# def get_key_press(array):
#     while True:
#         key = getch()
#         found = in_array(array, key)
#         if found:
#             return key
#         if key == '\b':
#             putch(' ')
#         else:
#             putch('\b')
#             putch(' ')
#             putch('\b')
part "GET_KEY_PRESS"
# Line 2
     push -1
     copy
     ichr
     get
# Line 3
     copy 1
     copy 1
     call "IN_ARRAY"
# Line 4
     zero "__GKP_FIX"
# Line 5
     away 1
     back
part "__GKP_FIX"
# Line 6
     push 8
     sub
     zero "__GKP_PRINT_SPACE"
# Line 8-11
     push 72
     call "PRINT"
     push 74
     call "PRINT"
     push 72
     call "PRINT"
     goto "GET_KEY_PRESS"
part "__GKP_PRINT_SPACE"
# Line 7
     push 74
     call "PRINT"
     goto "GET_KEY_PRESS"
# def get_mode():
#     print('Do want to add a number? ')
#     key = get_key_press('yn')
#     print()
#     if key == 'y':
#         return 1
#     return 0
part "GET_MODE"
     push 43
     call "PRINT"
     push 69
     call "GET_KEY_PRESS"
     push 17
     call "PRINT_LINE"
     push 121
     sub
     zero "__GM_RETURN"
     push 0
     back
part "__GM_RETURN"
     push 1
     back
# def add_array(array):
#     array.len -= 1
#     end_ptr = array.ptr + array.len
#     last1 = array[end_ptr + 1]
#     last2 = array[end_ptr]
#     end, array = last1 + last2, array
#     array[array.ptr + array.len] = end
part "ADD_ARRAY"
# Line 1
     copy
     copy
     get
     push 1
     sub
     set
# Line 2
     copy
     copy
     get
     add
# Line 3
     copy
     push 1
     add
     get
# Line 4
     swap
     get
# Line 5
     add
     swap
# Line 6
     copy
     get
     add
     swap
     set
     back
# def sub_array(array):
#     array.len -= 1
#     end_ptr = array.ptr + array.len
#     last1 = array[end_ptr + 1]
#     last2 = array[end_ptr]
#     end, array = last2 - last1, array
#     array[array.ptr + array.len] = end
part "SUB_ARRAY"
# Line 1
     copy
     copy
     get
     push 1
     sub
     set
# Line 2
     copy
     copy
     get
     add
# Line 3
     copy
     push 1
     add
     get
# Line 4
     swap
     get
# Line 5
     swap
     sub
     swap
# Line 6
     copy
     get
     add
     swap
     set
     back
# def mul_array(array):
#     array.len -= 1
#     end_ptr = array.ptr + array.len
#     last1 = array[end_ptr + 1]
#     last2 = array[end_ptr]
#     end, array = last1 * last2, array
#     array[array.ptr + array.len] = end
part "MUL_ARRAY"
# Line 1
     copy
     copy
     get
     push 1
     sub
     set
# Line 2
     copy
     copy
     get
     add
# Line 3
     copy
     push 1
     add
     get
# Line 4
     swap
     get
# Line 5
     mul
     swap
# Line 6
     copy
     get
     add
     swap
     set
     back
# def show_last(array):
#     print('Top: ')
#     ptr = len(array) + array.ptr
#     print(*ptr)
#     print()
part "SHOW_LAST"
# Line 1
     push 170
     call "PRINT"
# Line 2
     copy
     get
     add
# Line 3
     get
     oint
# Line 4
     push 17
     call "PRINT_LINE"
     back
# def dump_array(array):
#     if len(array) <= 0:
#         return
#     offset = 1
#     while len(array) - offset >= 0:
#          ptr = array.ptr + offset
#          sys.stdout.write('Stack[')
#          sys.stdout.write(str(offset))
#          sys.stdout.write('] = ')
#          sys.stdout.write(array[ptr])
#          print()
#          offset += 1
part "DUMP_ARRAY"
# Line 1-2
     copy
     get
     less "__DA_RET_1"
     copy
     get
     zero "__DA_RET_1"
# Line 3
     push 1
# Line 4
part "__DA_LOOP"
     copy
     copy 2
     get
     swap
     sub
     less "__DA_RET_2"
# Line 5
     copy 1
     copy 1
     add
# Line 6
     push 176
     call "PRINT"
# Line 7
     copy 1
     oint
# Line 8
     push 183
     call "PRINT"
# Line 9
     get
     oint
# Line 10
     push 17
     call "PRINT_LINE"
# Line 11
     push 1
     add
     goto "__DA_LOOP"
part "__DA_RET_2"
     away
part "__DA_RET_1"
     away
     back
# def div_array(array):
#     last = array[-1]
#     if last == 0:
#         sys.stdout.write('Error: ')
#         sys.stdout.write('DIV')
#         sys.stdout.write_line(' is illegal.')
#         return
#     array.len -= 1
#     end_ptr = array.ptr + array.len
#     last1 = array[end_ptr + 1]
#     last2 = array[end_ptr]
#     end, array = last2 / last1, array
#     array[array.ptr + array.len] = end
part "DIV_ARRAY"
# Line 1
     copy
     copy
     get
     add
     get
# Line 2
     zero "__DA_ZERO"
     goto "__DA_OKAY"
part "__DA_ZERO"
# Line 3-5
     push 188
     call "PRINT"
     push 196
     call "PRINT"
     push 200
     call "PRINT_LINE"
# Line 6
     away
     back
part "__DA_OKAY"
# Line 7
     copy
     copy
     get
     push 1
     sub
     set
# Line 8
     copy
     copy
     get
     add
# Line 9
     copy
     push 1
     add
     get
# Line 10
     swap
     get
# Line 11
     swap
     div
     swap
# Line 12
     copy
     get
     add
     swap
     set
     back
# def mod_array(array):
#     last = array[-1]
#     if last == 0:
#         sys.stdout.write('Error: ')
#         sys.stdout.write('MOD')
#         sys.stdout.write_line(' is illegal.')
#         return
#     array.len -= 1
#     end_ptr = array.ptr + array.len
#     last1 = array[end_ptr + 1]
#     last2 = array[end_ptr]
#     end, array = last2 % last1, array
#     array[array.ptr + array.len] = end
part "MOD_ARRAY"
# Line 1
     copy
     copy
     get
     add
     get
# Line 2
     zero "__MA_ZERO"
     goto "__MA_OKAY"
part "__MA_ZERO"
# Line 3-5
     push 188
     call "PRINT"
     push 213
     call "PRINT"
     push 200
     call "PRINT_LINE"
# Line 6
     away
     back
part "__MA_OKAY"
# Line 7
     copy
     copy
     get
     push 1
     sub
     set
# Line 8
     copy
     copy
     get
     add
# Line 9
     copy
     push 1
     add
     get
# Line 10
     swap
     get
# Line 11
     swap
     mod
     swap
# Line 12
     copy
     get
     add
     swap
     set
     back
# def do_action(stack):
#     print(MENU)
#     key = get_key_press('+-*/%tdq')
#     print()
#     if key == '+':
#         add_array(array)
#     elif key == '-':
#         sub_array(array)
#     elif key == '*':
#         mul_array(array)
#     elif key == '/':
#         div_array(array)
#     elif key == '%':
#         mod_array(array)
#     elif key == 't':
#         show_last(array)
#     elif key == 'd':
#         dump_array(array)
#     else:
#         sys.exit()
part "DO_ACTION"
     push 76
     call "PRINT"
     push 161
     call "GET_KEY_PRESS"
     push 17
     call "PRINT_LINE"
     copy
     push 43
     sub
     zero "__DA_ADD"
     copy
     push 45
     sub
     zero "__DA_SUB"
     copy
     push 42
     sub
     zero "__DA_MUL"
     copy
     push 47
     sub
     zero "__DA_DIV"
     copy
     push 37
     sub
     zero "__DA_MOD"
     copy
     push 116
     sub
     zero "__DA_TOP"
     push 100
     sub
     zero "__DA_DUMP"
# Here are several function calls.
     exit
part "__DA_DUMP"
     call "DUMP_ARRAY"
     back
part "__DA_TOP"
     away
     call "SHOW_LAST"
     back
part "__DA_MOD"
     away
     call "MOD_ARRAY"
     back
part "__DA_DIV"
     away
     call "DIV_ARRAY"
     back
part "__DA_MUL"
     away
     call "MUL_ARRAY"
     back
part "__DA_SUB"
     away
     call "SUB_ARRAY"
     back
part "__DA_ADD"
     away
     call "ADD_ARRAY"
     back
# def get_input(stack):
#     if len(stack) < 2:
#         get_number(stack)
#     else:
#         if get_mode() == 0:
#             do_action(stack)
#         else:
#             get_number(stack)
part "GET_INPUT"
     copy
     get
     push 2
     sub
     less "__GI_IF_1"
     call "GET_MODE"
     zero "__GI_IF_2"
part "__GI_IF_1"
     call "GET_NUMBER"
     back
part "__GI_IF_2"
     call "DO_ACTION"
     back
# Prints out size of a stack.
# push addr
# call "STACK_SIZE"
part "STACK_SIZE"
     push 0
     call "PRINT"
     get
     oint
     push 17
     call "PRINT_LINE"
     back
# Prints a string with newline.
# push addr
# call "PRINT_LINE"
part "PRINT_LINE"
     call "PRINT"
     push 10
     ochr
     back
# def print(array):
#     if len(array) <= 0:
#         return
#     offset = 1
#     while len(array) - offset >= 0:
#          ptr = array.ptr + offset
#          putch(array[ptr])
#          offset += 1
part "PRINT"
# Line 1-2
     copy
     get
     less "__PRINT_RET_1"
     copy
     get
     zero "__PRINT_RET_1"
# Line 3
     push 1
# Line 4
part "__PRINT_LOOP"
     copy
     copy 2
     get
     swap
     sub
     less "__PRINT_RET_2"
# Line 5
     copy 1
     copy 1
     add
# Line 6
     get
     ochr
# Line 7
     push 1
     add
     goto "__PRINT_LOOP"
part "__PRINT_RET_2"
     away
part "__PRINT_RET_1"
     away
     back
